#include <stdio.h>

// 题目大意为计算n行m列的矩形网格中，正方形的总个数 和 非正方形的长方形总个数，这道题目主要考察大家对于循环以及枚举的理解
// 以及对于数学公式的推导能力，下面的代码中包含了详细的注释，帮助大家理解每一步的逻辑
int main() {
    // 定义变量：n存储网格的行数，m存储网格的列数
    int n, m;
    // 输入棋盘的行数n和列数m（例如输入3 4，表示3行4列的网格）
    scanf("%d %d", &n, &m);
    
    // 定义变量squareCount，用于累加所有不同边长的正方形个数，初始化为0
    int squareCount = 0;
    
    // 循环计算不同边长的正方形个数：边长i的取值范围是1到min(n,m)
    // 原因：正方形的边长不能超过网格的行数或列数（否则无法放置），故最大边长为两者较小值
    for (int i = 1; i <= n && i <= m; i++) {
        // 核心公式：边长为i的正方形，横向可放置的数量为 (n - i + 1)
        //          纵向可放置的数量为 (m - i + 1)
        //          该边长正方形的总数 = 横向数量 * 纵向数量，累加到squareCount
        // 示例：3行4列网格，边长2的正方形：横向3-2+1=2个，纵向4-2+1=3个，共2*3=6个
        squareCount += (n - i + 1) * (m - i + 1);
    }
    
    // 计算长方形（包含正方形）的总个数
    // 原理：长方形由“横向两条不同的线”和“纵向两条不同的线”围成
    // 横向选2条线的组合数：从(n+1)条横线中选2条，公式为 n*(n+1)/2（组合数C(n+1,2)）
    // 纵向选2条线的组合数：从(m+1)条纵线中选2条，公式为 m*(m+1)/2（组合数C(m+1,2)）
    // 总长方形数 = 横向组合数 * 纵向组合数（包含所有正方形和非正方形长方形）
    int totalRectCount = (n * (n + 1) / 2) * (m * (m + 1) / 2);
    
    // 非正方形的长方形个数 = 总长方形数（含正方形） - 正方形个数
    int rectCount = totalRectCount - squareCount;
    
    // 输出结果：第一个数是正方形总个数，第二个数是非正方形的长方形总个数
    printf("%d %d\n", squareCount, rectCount);
    
    return 0;
}